//给你一个整数数组 nums 和一个整数 x 。每一次操作时，你应当移除数组 nums 最左边或最右边的元素，然后从 x 中减去该元素的值。请注意，需要 修改
// 数组以供接下来的操作使用。 
//
// 如果可以将 x 恰好 减到 0 ，返回 最小操作数 ；否则，返回 -1 。 
//
// 
//
// 示例 1： 
//
// 
//输入：nums = [1,1,4,2,3], x = 5
//输出：2
//解释：最佳解决方案是移除后两个元素，将 x 减到 0 。
// 
//
// 示例 2： 
//
// 
//输入：nums = [5,6,7,8,9], x = 4
//输出：-1
// 
//
// 示例 3： 
//
// 
//输入：nums = [3,2,20,1,1,3], x = 10
//输出：5
//解释：最佳解决方案是移除后三个元素和前两个元素（总共 5 次操作），将 x 减到 0 。
// 
//
// 
//
// 提示： 
//
// 
// 1 <= nums.length <= 105 
// 1 <= nums[i] <= 104 
// 1 <= x <= 109 
// 
// Related Topics 贪心算法 双指针 二分查找 Sliding Window 
// 👍 33 👎 0
#include <iostream>
#include <vector>
using namespace std;


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:
    int minOperations(vector<int>& nums, int x) {
        int len = nums.size(), sum = 0;
        for (int num : nums){
            sum += num;
        }

        int target = sum - x;

        if (target == 0){
            return len;
        } else if (target < 0){
            return -1;
        }

        int ans = -1, left = 0, right = left + 1,cur = nums[left];

        while (left <= right && right <= len){
            if (cur == target){
                ans = max(ans,right-left);
            }
            if (cur <= target){
                cur += nums[right++];
            } else{
                cur += nums[left--];
            }
        }
        return ans == -1 ? ans : (len - ans);
    }
};
//leetcode submit region end(Prohibit modification and deletion)
